// 接受一个配置对象
function axios({
  url,
  methods='GET',
  params={},
  data={}
}) {
  // get和delete需要在url后通过?拼接数据传递
  let queryStr = ''
  // {a: 1, b: 2} ==> a=1&b=2
  Object.keys(params).forEach(key => {
    queryStr += `&${key}=${params[key]}` // &a=1&b=2
  })
  // 如果有queryStr说明是get和delete方法
  if(queryStr) {
    queryStr = queryStr.substring(1) // a=1&b=2
    // 在url后以?拼接
    url += '?' + queryStr
  }

  // data是对象格式,需要转换成JSON字符串在请求体中传递
  data = JSON.stringify(data)

  // axios返回一个promise对象,成功调用onResolved回调函数,失败调用onRejected回调函数
  return new Promise((resolve, reject) => {
    // 1.创建xhr实例,发送ajax请求
    let xhr = new XMLHttpRequest()
    // 2.绑定事件监听
    xhr.onreadystatechange = function() {
      // 如果readyState不为4说明还没完全成功,立刻退出执行
      if(xhr.readyState !== 4) return
      // 状态码在200-299说明成功
      if(xhr.status >= 200 && xhr.status < 299) {
        const response = {
          data: JSON.parse(xhr.response), // 响应数据
          status: xhr.status, // 状态码
          statusText: xhr.statusText // 状态文本
        }
        // 调用resolve,改变状态为resolved,指定成功的response值
        resolve(response)
      } else {
        // 失败时,调用reject,指定失败的error值
        reject(new Error('请求出错' + xhr.status))
      }
    }
    // 3.调用open方法
    xhr.open(methods, url, true)
    // 4.调用send方法,如果是post和put方式需要在请求体中发送数据
    if(methods.toUpperCase() === 'POST' || methods.toUpperCase() === 'PUT') {
      xhr.send(data)
    } else {
      xhr.send()
    }
  })
}